IntellijでScalaビルド時にユーザ定義環境変数を定義するための手段について幾つか試してみた
はじめに
IntelliJ上でsbt shellにてビルド実行時、build.sbtを読み込むタイミングで環境変数が見つからず失敗するという状況に陥りました。静的ファイルから取得していたバージョン情報を環境変数経由に変更し、Scalaコード経由で参照してbuild.sbt内で定義するという仕組みでしたが上手くいかなかったようです。
.envファイルからの読み取り、VMのパラメータからsbtoptsまで確認したものの、sbt shell起動時にbuild.sbtを読み込んだタイミングでユーザ定義の環境変数は設定出来ないようで、適切なビルド構成に環境変数指定を追加することで対応しました。
今回のパラメータの受け渡しについて調べていると、色々な質疑投稿で案外特定の手段だけ提示されていることが多いことに気が付きました。手段毎に検索する手間を減らすことを兼ねて、色々な手段を一通り触ってみた結果についてまとめてみました。
検証環境について
- macOS Catalina 10.15.7
- IntelliJ IDEA 2020.3 Ultimate
- Scala 2020.3.16
IntelliJ上でビルド時に独自環境変数を定義する
実行設定への追加や、プラグインを用いる方法等いくつかあります。広く使われていると思われる方法について挙げていきます。
- ScalaTestでのEnvironment Variables
- EnvFileでの設定
- sbtopts
ScalaTestでのEnvironment Variables
実行する方法によって環境変数を切り替えたいのであれば、この設定がおすすめです。
メニューの「RUN」から「Edit Configurations…」を選択。
「Add New Configuration」から「ScalaTest」を選択します。
「Environment Variables」に<NAME>=<KEY>
と入力します。
右側から専用のダイアログを利用することも可能です。
EnvFileでの設定
外部ファイル参照となるので、管理のしやすさがポイントです。
インストール後、ScalaTestの設定に「EnvFile」が追加されます。設定方法は上記リンク先に記載されている通りです。
項目 | 意味 |
---|---|
Substitute Environment Variables (${FOO} / ${BAR:-default} / $${ESCAPED}) | 代替環境変数(${FOO} / ${BAR:-default} / $${ESCAPED})を有効にする |
Process JetBrains path macro references ($PROJECT_DIR$) | JetBrainsのパスマクロ参照($PROJEDT_DIRS$)を処理する |
Ignore missing files | ファイルがない場合に無視する |
Enable experimental integrations (e.g. Gradle) - may break any time! | Gradle等の実験的な連携を有効にする - 何時でも停止できます |
利用するEnvFileの指定にて.env
がファイルダイアログ上で非表示になっている場合は、Shift + Command + .(ピリオド)
で表示させましょう。
値の設定はVERSION=test
のようにシェルでの定義と同一です。
sbtoptsでの指定
EnvFileと異なり、追加指定はせずに使えます。プロジェクトルートに.sbtopts
ファイルを追加します。書き方はVMでパラメータを追加する時と同じです。
設定方法別一覧
方法 | 特徴 | 値の設定 | 実際の設定 |
---|---|---|---|
Environment Variables | 環境変数として設定する |
<KEY>=<VALUE> |
VERSION=test |
EnvFile | プラグインのインストールが必要。 独自に.envファイルから読み込みを行う。 ジョブ実行直後にはまだ反映されていない。 |
<KEY>=<VALUE> |
VERSION=test |
sbtopts | sbtのオプションとしてVMに渡す。 プロジェクトルートでドットファイルにて管理。 追加設定は不要。 |
-D<KEY>=<VALUE> |
-DVERSION=test |
これらを全て導入しても、いずれも機能します。が、キーが同じで値が異なる場合、想定外な挙動になる可能性があります。
あとがき
静的ファイルからの読み込みで賄えてしまっていたためにビルド構成に手をつけていなかったのが原因でしたが、パラメータを渡す方法について実際に動作を見ながら確認するいい機会になりました。
ユースケースに応じての参考になれば幸いです。